home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / sys / kowin14d.lzh / doc / programming / user.doc < prev    next >
Text File  |  1994-12-19  |  6KB  |  144 lines

  1.  
  2.  Ko-Window プログラマーズマニュアル
  3.  
  4. 「ユーザーイベントの割り当て方法」
  5.  
  6.  
  7. ●昔のユーザーイベント
  8.  
  9.   Ko-Window では、ユーザーアプリケーション用に EventUser を用いることができま
  10. す。v2.00 等の昔のサーバーでは、利用方法に特に取り決めはなく、FINDER.win の
  11. ファイル名転送に ComBuffer が使われていただけでした。そのため実際は FINDER
  12. とぶつからないように、きわめてトリック的な使い方が必要で、その頃の影響が今の
  13.  USK_WIN 等の独自のフォント転送フォーマットに残されています。
  14.  
  15.  
  16. ●システムで決まっているユーザーコード
  17.  
  18.   それを考慮してか、従来使われていなかった ComData を識別コードとし、実際の
  19. データは常に ComBuffer の示すポインタで転送するよう prog.doc で取り決めが行
  20. なわれました。
  21.  
  22.   イベント構造体の中で、UserEvent で主に用いられるのは次の2つです。
  23.  
  24.     int    ComData        32bit の整数値
  25.     void    *ComBuffer    データ領域へのアドレス
  26.  
  27. 各アプリケーションは、EventUser を受け取る場合には必ず ComData を参照し、そ
  28. の値によって ComBuffer からデータを得ます。ComData が自分の欲しいイベントデー
  29. タでないなら、受け取りません。
  30.  
  31.   prog.doc の取り決めでは、ComData で使用する識別コードは
  32.  
  33.     UserPaste
  34.     UserString
  35.     UserStrings
  36.     UserSheet
  37.  
  38. の4つのみ規定されています。これらは今までのアプリケーションで慣例的に使われ
  39. てきたいくつかの暗黙のルールのようなものがありますので、それを説明します。
  40.  
  41.    ComData が UserPaste の時の ComBuffer は、char* であり、Clip Board の内容
  42. を示しています。これは通常、ウィンドウマネージャーが発するイベントです。アプ
  43. リケーションはこれをキー入力として受け取るものもありますが、いきなり単体のファ
  44. イル名としてアクションを起こす場合もあります。そのへんの使い分けが、UserString
  45. と微妙に違います。もし複数行にデータが渡る場合は、その区切りは改行キーコード
  46. になります。データの終わりは '\0' です。
  47.  
  48.    ComData が UserString では、ComBuffer はやはり char* であり、こちらはただ
  49. の文字列を転送する場合によく用いられます。受け取り側はそれをキー入力やファイ
  50. ル名等必要に応じて処理します。または外部からの制御コマンドの送信に使われるこ
  51. ともあります。
  52.  
  53.    ComData が UserStrings では、ComBuffer は char** です。これは FINDER での
  54. ファイル名転送フォーマットからきています。KF 等でもこれを用いますので、通常
  55. この UserStrings が送られてきたら、1つ以上のファイル名を示すポインタ配列への
  56. ポインタと見てまず間違いないでしょう。もちろん、ただの複数文字列として転送に
  57. 用いることもできます。Command.win 等では受け取った場合はただのキー入力になり
  58. ます。
  59.  
  60.    ComData が UserSheet の場合では、ComBuffer は必ず Sheet* でテキストのグラ
  61. フィックパターンを示します。PED や背景等で使う3階調モノクロのビットマップで
  62. す。Ko-Window 上でのパターン転送では、必ずこのイベントが使われています。(唯
  63. 一の例外が USK_WIN, TC_WIN 等の旧型フォントデータです)
  64.  
  65.         case UserEvent:
  66.             switch( info->ComData ){
  67.             default:
  68.                 return    FALSE;
  69.             case UserStrng:
  70.             case UserPaste:
  71.                 KeyString( (char*)info->ComBuffer );
  72.                 break;
  73.             case UserStrings:
  74.                   :
  75.                   :
  76.             }
  77.             return    TRUE;
  78.  
  79.     UserEvent 受取例の一部 (よく用いられるパターン)
  80.  
  81.  
  82.  
  83. ●ユーザーコードの拡張
  84.  
  85.   さて、上記以外のデータを転送する必要が生じた場合どうすればいいのでしょうか。
  86.  prog.doc では、UserSheet から続くコードを便宜割り当てユーザー側で使用できる
  87. ように書いていますが、それでは他の人とコードの取合いになってしまい都合が悪い
  88. のです。
  89.  
  90.   そこで、今までの私の各種アプリケーションでは、以下のようなルールによってユー
  91. ザーコードを使用してきました。
  92.  
  93.     ・単純なデータは文字列で転送する (UserString/UserStrings)
  94.       文字列でデータを判別し、各ファンクションコードは文字列先頭の識別子
  95.       で判定する。
  96.  
  97.     ・各アプリケーションのコントロールファンクション呼び出しは、半角4文
  98.       字以内で識別子を付け、それをそのまま 32bit の ComData として呼び出
  99.       す。
  100.  
  101.   ここで、アプリケーションのコントロールファンクションについてちょっとだけ説
  102. 明します。今まで私が組んできたプログラムは、早期からウィンドウ間通信の柔軟性
  103. を大切にしてきました。できるだけデータはウィンドウ外部と任意にやりとりでき、
  104. さらに外部から簡単なイベントコードでそのアプリケーションをコントロールするこ
  105. とができます。
  106.   例えば、KF なら ComData= 'KF' として、ComBuffer に実行させたいファンクショ
  107. ン命令文字列のアドレスを入れて転送すると、KF はそれに従った動作をします。つ
  108. まり共通性を持たせるデータだけでなく、その動作をも他のアプリケーションに公開
  109. してしまうのです。
  110.   これは、Command.win でも KX_Term20 でもなんでも、内部で複雑な動作のできる
  111. 重要なアプリケーションは全部持っています。
  112.  
  113.   そこで、このような外部からそのアプリケーション独自のイベントが必要な場合に
  114. は、KF なら 'KF' 、KX_Term20 なら 'K20' というようにコード割り当てを行ないま
  115. す。
  116.  
  117.   もちろん、たった4文字なので衝突が起こらないとも限りませんが、わかりにくい
  118. コードを順に割り当てるよりはかなり良いのではないでしょうか。よって、今後この
  119. ようなユーザーコードの使用法を使うようにしましょう。また、今まではどちらかと
  120. いうと隠し機能的な扱いであったコントロールファンクションですが、今後識別子を
  121. ドキュメント等で積極的に公開していくことにしましょう。
  122.  
  123.   識別子の付け方は、むやみやたらに用いずできるだけそのアプリケーションが連想
  124. できるもの、バージョン名等を含ませずに、同じアプリケーションなら一貫してその
  125. コードが使えること。もちろん、原則として1アプリケーションは1識別子を用い、
  126. 機能の分岐は ConBuffer を使います。ComBuffer はできるだけ文字列へのポインタと
  127. し、直接データを持たず、将来そのアプリケーションで機能拡張が行なわれても問題
  128. ないようにしましょう。
  129.   1番いいのは UserStrings のように、ポインタ配列へのポインタとし、最初のポ
  130. インタは、正式なプログラム名で始まる機能を表す文字列を格納します。それ以後の
  131. ポインタは引数として、機能によってさまざまなデータを置くことができます。
  132. (もちろん、強制ではありません)
  133.  
  134.   話はそれますが、上記のコントロールファンクションで述べたように、Ko-Window
  135. の1つの顔として、この柔軟なウィンドウ間通信があげられるようさまざまやってき
  136. ました。ですから、ぜひ皆さんのプログラムも、もっとウィンドウ間通信のやりとり
  137. の重要性に理解を示し、積極的にアプリケーションに組み込んでみて下さい。
  138.  
  139.  
  140. 1993/4/20  小笠原博之
  141. oga@dgw.yz.yamagata-u.ac.jp
  142. DenDenNET: DEN0006 COR.
  143.  
  144.